package com.kinyx.framework.log;

import com.kinyx.framework.reflect.KBeanUtils;

import lombok.AccessLevel;
import lombok.NoArgsConstructor;

/**
 * 日志工具
 */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class Logger {

	/** 日志工厂对象 */
	private static LogFactory<?> factory;

	/**
	 * 初始化工厂对象
	 */
	static {
		factory = KBeanUtils.newInstance(Configs.LogFactoryClass);
		factory.initialize();
		factory.setRootLevel(LogLevel.trace);
		Configs.levels.forEach((packageName, level) -> {
			if (packageName.equals(Configs.ROOT)) {
				factory.setRootLevel(level);
			} else {
				factory.setLevel(packageName, level);
			}
		});
	}

	/**
	 * 获取日志对象
	 * @param clazz 日志对象持有的类型
	 * @return 日志对象
	 */
	public static Log getLog(final Class<?> clazz) {
		return factory.newInstantce(clazz);
	}

	/**
	 * 获取日志级别
	 * @param packageName 包名
	 * @return 日志级别
	 */
	public static LogLevel getLevel(final String packageName) {
		final LogLevel level = Configs.levels.get(packageName);
		if (level != null) { return level; }
		// 精确的匹配未找到，则尝试向上匹配。
		if (packageName.contains(".")) {
			return getLevel(packageName.substring(0, packageName.lastIndexOf(".")));
		}
		// 最上层包也未匹配到，则返回根级别。
		return Configs.levels.get(Configs.ROOT);
	}

	/**
	 * 设置日志级别
	 * @param packageName 包名
	 * @param level 日志级别
	 */
	public static void setLevel(final String packageName, final LogLevel level) {
		if (packageName.equals(Configs.ROOT)) {
			Configs.levels.put(Configs.ROOT, level);
			factory.setRootLevel(level);
		} else {
			Configs.levels.put(packageName, level);
			factory.setLevel(packageName, level);
		}
	}

}
